package study;

/**
 * 内部类          也有独立的.class字节码文件        外部类名$内部类名.class
 * 匿名内部类
 * */
public class InnerClassDemo {
    private int x;
    public InnerClassDemo(int x) {
        this.x = x;
    }
    public InnerClass getInnerClass() {
        return new InnerClass();
    }
    public void show() {
        System.out.println("外部类");
    }

    public class InnerClass {
        public void show() {
            System.out.println("内部类可访问外部类的成员变量：x=" + x);
        }
    }

    public static void main(String[] args) {
        InnerClass innerClass = new InnerClassDemo(100).getInnerClass();
        innerClass.show();
        int r = 3;
        A a = new A(){
            /**
             * 匿名内部类
             * 不能修改外部局部变量的值，外部局部变量会被默认为final变量，但可访问其值
             * */
            @Override
            void show() {
//                r = 33;
                System.out.println("派生类");
                System.out.println(r);
            }
        }; // 大括号中为派生类的类体
        a.show();
        B b = new B();
    }
}

abstract class A {
    abstract void show();
}

class B extends A {

    @Override
    void show() {

    }
}